/* 程序说明：
  串口数据帧格式：
  比如一个灯的格式为（11，    255，255，255）  ==>16进制对应为“0affffff” ==> 转换我蓝牙收发的字符串为“184549375;”
                  led序号  r    g    b
  184549375为的字符串，需要用strtol来转换为unsigned long格式，然后用%和/来转换为（11，    255，255，255）
*/
#include <FastLED.h>
#include <SoftwareSerial.h>

#define NUM_LEDS 8      // LED灯珠数量，受限于自定义的传输格式，最大只支持255个led
#define LED_DT 10       // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序

uint8_t max_bright = 128; // LED亮度控制变量，可使用数值为 0 ～ 255， 数值越大则光带亮度越高

CRGB leds[NUM_LEDS];        // 建立光带leds
CRGB myRGBcolor(50, 0, 50); //myRGBcolor（红色数值，绿色数值，蓝色数值）

SoftwareSerial BT(9, 10); //新建对象，接收脚为8，发送脚为9

/* 测试led能不能按照固定帧格式显示 */
void testLed()
{
    String comstr = "";
    char comchar;
    char firstChar;
    unsigned char rVal = 0;
    unsigned char gVal = 0;
    unsigned char bVal = 0;
    int number = 0;

    while (Serial.available() > 0)
    {
        comchar = Serial.read();

        if (',' != comchar)
        {
            comstr += comchar;
        }

        else //到字符串的结尾  ！！！双引号是字符串，单引号是字符！！！
        {
            firstChar = comstr[0];

            if ('A' == firstChar && 14 == comstr.length()) //数据帧 如A0001255000111,
            {
                Serial.println(comstr);
                number = comstr.substring(1, 5).toInt();                //substring返回从1到4
                rVal = (unsigned char)(comstr.substring(5, 8).toInt()); //"123" --> 123
                gVal = (unsigned char)(comstr.substring(8, 11).toInt());
                bVal = (unsigned char)(comstr.substring(11).toInt()); //返回从11到之后的字符

                leds[number].r = rVal;
                leds[number].g = gVal;
                leds[number].b = bVal;

                FastLED.show(); // 更新LED（相当于更新灯带的一帧）
            }
            else if ('B' == firstChar) //命令帧 fillSolid 将整个灯带设置成一样的颜色
            {
            }
            else if ('C' == firstChar) //命令帧 fillRainbow 将LED光带设置为渐变彩虹色
            {
            }
            else if ('D' == firstChar) //命令帧 fillGradient 将LED光带设置为渐变色
            {
            }
            else if ('E' == firstChar) //命令帧 fadeToBlackBy 逐渐熄灭LED光带
            {
            }
            else if ('F' == firstChar) //命令帧 FastLED.setBrightness – 设置LED光带亮度
            {
            }
            else
            {
                /* code */
            }
        }
    }
}

/* 测试蓝牙数据收发 */
void testBTserial()
{
    String comstr = "";
    char comchar;
    char val;
    ;
    /* 测试蓝牙模块发送拘数据 */
    if (Serial.available() > 0)
    {
        val = Serial.read();
        BT.print(val);
    }

    /* 测试蓝牙模块接收功能 */
    while (BT.available() > 0)
    {
        comchar = BT.read();
        if (',' != comchar)
        {
            comstr += comchar;
        }
        else
        {
            Serial.print(comstr);
        }
    }
}
void setup()
{
    Serial.begin(9600); //与电脑的串口连接
    Serial.println("BT is ready!");
    BT.begin(9600); //设置波特率

    LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
    FastLED.setBrightness(max_bright);                           // 设置光带亮度
    set_max_power_in_volts_and_milliamps(5, 1000);               // 光带电源管理（设置光带5伏特，500mA）
}

void loop()
{
    testLed();
    // testBTserial();
}
